Developing Applications for iOS using SwiftUI
Total Lecture: 15
current: [1-3]
Getting Started with SwiftUI
behaves like a …
1 | import SwiftUI |
ContentView
结构体的行为类似于View
,函数式编程关注的是功能、行为,而不是数据。面向对象编程的根源(root)是数据封装。函数式编程更像是行为封装。
1 |
|
Int
,String
都是结构体,View
不是一个结构体,是一种可以表现的东西,称为协议。
Computed Property
1 | struct ContentView: View { |
变量的值没有存储在某个地方,是只读变量,是计算出来的。body
用var
,因为这里可能有变量,导致它在每次调用它时返回不同的东西。
some View
意味着这个变量的类型必须是世界上的任何结构,只要它的行为像View
一样
creating instances of structs
1 | Image(systemName: "globe") |
named parameters
systemName
parameter defaults
1 | VStack(alignment: .leading, spcing: 20) { |
1 | VStack(){ |
VStack()
后面大括号里实际上是一个函数。该函数返回一个View
,完整的调用代码如下
1 | import SwiftUI |
VStack
是一个接受这个参数的试图。函数里面返回的是一个打包为TupleView
函数式编程,函数始终作为参数传递给其他事物。
@ViewBuilder
将View
列表转换为TupleView
的东西称为@ViewBuilder
TupleView(bag of Lego)
View modifier
.imageScale()
,.foregroundColor()
,.padding()
,这些是函数,也叫View modifier
,因为它的作用是在View
上调用它,Image
是一个行为类似于View
的结构体,因此可以在其上调用这些函数。
More SwiftUI
1 | import SwiftUI |
some View
1 | struct ContentView: View { |
Cannot convert return expression of type
VStack<TupleView<Text,Text>>
to return typeText
trailing closure syntax
1 | ZStack(alignment: .center , content:{ |
ZStack
是一个行为类似于View
的结构体,有两个参数。任何创建对象或函数的最后一个参数是函数本身,这里是一个返回视图(TupleView
)的函数,可以省略掉它的标签content
1 | ZStack(alignment:. center) { |
alignment
默认值为center
所以上面可简写成
1 | ZStack { |
locals in @ViewBilder
1 | ZStack { |
Views are immutable
1 |
|
Cannot assign to property:’self’ is immutable
@State
@State var isFaceUp = false
创建一个指向保存isFaceUp
的指针,指针本身不会改变,它指向的东西可以改变,所以它满足View
不能改变但isFaceUp
可以改变
ViewBuilder can do
ViewBuilder中不能使用for
,可以做三件事,条件、列表、局部变量
1 | ForEach(0..<4, is: \.self) { index in |
ForEach
有一个ViewBuilder
作为参数,这个ViewBuilder
将拥有这四件事中每一个View
,ViewBuilder
是一个函数,函数可以有参数index
implicit return
1 | var cards: some View { |
为什么这里可以省略return
,cards
是一个计算属性,它返回HStack{}
,它不是ViewBuilder
,HStack
中的内容是ViewBuilder
,但是HStack
本身不是,这里只是一个普通的函数,它只有一行代码,所以不需要return
,这种称为隐式返回(适用于函数和计算属性)。
internal VS external parameter names
1 | func cardCountAdjuster(by offset: Int, symbol:String) -> some View{ |
有两个标签时by offset
,第一个by
是调用者使用的标签,第二个offset
是在函数中使用,symbol
既是外部名称又是内部名称
MVVM
MVVM
Separating “Logic and Data” from “UI”
Swift Type System
struct and class
struct是函数式编程的基础
函数式编程 VS 面向对象编程
面向对象编程: 数据封装,封装现实世界概念或事物的数据,然后将功能与该数据相关联,将其全部封装到一个具有与该数据相关的函数的结构中,它增加了继承
函数式编程: 行为封装,在函数式编程中,我们真正想要的东西之一是可证明性(计算机科学中的概念),面向对象编程中无法实现,因为你不知道谁将拥有一个指向你的类的指针,而在函数式编程中,你可以,因为你总是传递其中的内容的副本,没人可以从外部干扰该功能,
函数式编程:behaves like a …
可证明性: 你希望能够获取一段代码并证明它无论发生什么,无论它处于什么环境或其他什么情况下都会做它会做的事情。